package org.example;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

public class CalculateTime {

    private final static String pattern = "yyyy-MM-dd HH:mm:ss";

    // 计算通话时长，考虑夏令时的影响
    public static long calculateCallDuration(String startTimeString, String endTimeString) {
        // 先将String转换为LocalDateTime
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
        LocalDateTime startTime = LocalDateTime.parse(startTimeString,formatter);
        LocalDateTime endTime = LocalDateTime.parse(endTimeString,formatter);
        // 如果开始和结束时间跨越了夏令时变更，需要特殊处理
        if (isSpringTimeChange(startTime, endTime) || isAutumnTimeChange(startTime, endTime)) {
            // 处理夏令时变更的逻辑
            return handleTimeChange(startTime, endTime);
        }

        // 常规计算时长
        long durationMillis = ChronoUnit.MILLIS.between(startTime, endTime);
        return (long) Math.ceil((durationMillis / (1000 * 60))); // 转换为分钟，不足一分钟的按照一分钟计算
    }

    // 检查是否跨越了春季夏令时变更
    private static boolean isSpringTimeChange(LocalDateTime startTime, LocalDateTime endTime) {
        // 假设春季变更发生在3月的第一个星期日凌晨2点
        LocalDateTime springChange = LocalDateTime.of(2023, 3, 3, 2, 0);
        return !startTime.isAfter(springChange) && endTime.isAfter(springChange.plusHours(1));
    }

    // 检查是否跨越了秋季夏令时变更
    private static boolean isAutumnTimeChange(LocalDateTime startTime, LocalDateTime endTime) {
        // 假设秋季变更发生在11月的第一个星期日凌晨2点
        LocalDateTime autumnChange = LocalDateTime.of(2023, 11, 3, 2, 0);
        return !startTime.isAfter(autumnChange) && endTime.isAfter(autumnChange);
    }

    private static int handleTimeChange(LocalDateTime startTime, LocalDateTime endTime) {
        // 假设夏令时变更时，时钟从2:00跳到3:00
        // 如果开始时间在变更前，结束时间在变更后，则需要减去一个小时
        if (startTime.isBefore(endTime.minusHours(1)) && startTime.getHour() == 2 && endTime.getHour() == 3) {
            return (int) ChronoUnit.HOURS.between(startTime, endTime.minusHours(1));
        }
        // 秋季变更类似处理，但考虑到时钟从2:59:59跳到2:00:00
        return (int) ChronoUnit.MILLIS.between(startTime, endTime) / (1000 * 60); // 常规计算
    }
}
